package com.itzdm.ai.model;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * 用户聊天上下文，存储与特定用户的对话历史
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ChatContext implements Serializable {
    private static final long serialVersionUID = 1L;
    
    /**
     * 用户ID，用于在Redis中作为Key
     */
    private Long userId;
    
    /**
     * 对话历史消息列表
     */
    @Builder.Default
    private List<ChatMessage> messageHistory = new ArrayList<>();
    
    /**
     * 添加用户消息
     */
    public void addUserMessage(String content) {
        ChatMessage message = ChatMessage.builder()
                .role("USER")
                .content(content)
                .build();
        messageHistory.add(message);
    }
    
    /**
     * 添加系统回复消息
     */
    public void addAssistantMessage(String content) {
        ChatMessage message = ChatMessage.builder()
                .role("ASSISTANT")
                .content(content)
                .build();
        messageHistory.add(message);
    }
    
    /**
     * 添加带推理内容的助手消息
     */
    public void addAssistantMessageWithReasoning(String content, String reasoningContent) {
        ChatMessage message = ChatMessage.builder()
                .role("ASSISTANT")
                .content(content)
                .reasoningContent(reasoningContent)
                .build();
        messageHistory.add(message);
    }
    
    /**
     * 添加完整的消息对象
     */
    public void addMessage(ChatMessage message) {
        messageHistory.add(message);
    }
    
    /**
     * 添加系统消息
     */
    public void addSystemMessage(String content) {
        ChatMessage message = ChatMessage.builder()
                .role("SYSTEM")
                .content(content)
                .build();
        
        // 系统消息通常放在消息列表的开头
        if (!messageHistory.isEmpty() && "SYSTEM".equalsIgnoreCase(messageHistory.get(0).getRole())) {
            // 如果已经有系统消息，则替换它
            messageHistory.set(0, message);
        } else {
            // 否则，将系统消息添加到列表开头
            messageHistory.add(0, message);
        }
    }
} 